from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status
from course.models import CourseModel
from django_redis import get_redis_connection
# Create your views here.


# 获取购物车中，勾选的商品列表
class CartToOrderViews(APIView):
    permission_classes = [IsAuthenticated]
    def get(self,request):
        user_id = request.user.id
        # 从redis中根据用户id，获取当前用户所有数据
        redis = get_redis_connection('cart')
        cart_hash = redis.hgetall(f"cart_{user_id}")
        if len(cart_hash)<1:
            return Response({"message":'购物车中没有添加任何课程信息---'},status=status.HTTP_204_NO_CONTENT)
        # 获取购物车中的数据，  购物车中的数据
        cart = [(int(key.decode()),bool(int(value.decode())))for key,value in cart_hash.items()]
        # [(1,Ture),(2,Ture)]
        # 数据，判断
        # 获取选中的课程id列表
        course_id_list = [i[0] for i in cart if i[1]==True]
        # 根据选中的课程id列表，获取课程详细信息
        course_list = CourseModel.objects.filter(id__in=course_id_list, is_deleted=False, is_show=True)
        # 创建空列表，用于存放课程精简信息（课程列表）
        data =[]
        for course in course_list:
            data.append({
                "id": course.id,
                "name": course.name,
                "course_cover": "http://127.0.0.1:8000" + course.course_cover.url,
                "price": course.price,
                "discount": course.discount,
                "course_type": course.course_type,
                "credit": course.credit,
            })
        return Response({"message": "获取购物车选中商品成功", 'cart': data})


class CartView(APIView):
    # 配置，访问视图接口的用户权限
    permission_classes = [IsAuthenticated,]
    # drf配置了用户校验的操作
    def post(self,request):
        user_id = request.user.id
        # 获取课程id
        course_id = request.data.get('course_id')
        # 默认选中
        selected = 1
        # 判断课程是否存在
        try:
            CourseModel.objects.get(is_deleted=False,is_show=True,id=course_id)
            # 获取redis链接
            redis = get_redis_connection('cart')
            redis.hset(f"cart_{user_id}",course_id,selected)
            # 当前购物车总量返回给客户端
            cart_total = redis.hlen(f"cart_{user_id}")
            return Response({"message":'购物车添加成功','cart_total':cart_total},status=status.HTTP_200_OK)
        except CourseModel.DoesNotExist:
            print('课程不存在，添加购物车失败，请刷新课程信息-----')
            return Response({"message":'课程不存在，添加购物车失败，请刷新课程信息---'},status=status.HTTP_400_BAD_REQUEST)



    def get(self,request):
            # 获取购物车
            user_id = request.user.id
            # redis中查询数据
            redis = get_redis_connection('cart')
            # 获取用户购物车所有数据
            cart_hash = redis.hgetall(f"cart_{user_id}")
            print(cart_hash)
            # 根据redis返回数量，判断是否有数据存在redis中
            if len(cart_hash) < 1:
                return Response({"message":'没有数据'})
            # 有数据，将redis中获取到的数据，转换成python中可以使用的数据类型
            cart = [(int(key.decode()),bool(value.decode())) for key,value in cart_hash.items()]
            # 获取redis中所有的课程id
            course_id_list = [i[0] for i in cart]
            # 数据库中查询课程数据
            course_list = CourseModel.objects.filter(id__in=course_id_list,is_deleted=False,is_show=True)
            data = []
            for course in course_list:
                data.append({
                    "id":course.id,
                    "name":course.name,
                    "course_cover":"http://127.0.0.1:8000"+course.course_cover.url,
                    "price":float(course.price),
                    "discount":course.discount,
                    "course_type":course.course_type,
                    "credit":course.credit,
                    "selected":(str(course.id).encode() in cart_hash and cart_hash[str(course.id).encode()].decode() == "1")
                })
            return Response({"message":'获取购物车数据成功',"cart":data})
    def patch(self,request):
        user_id = request.user.id
        course_id = request.data.get('course_id',0)
        selected = int(request.data.get('selected',True))
        redis = get_redis_connection('cart')
        # 判断当前课程是否存在，存在的情况下 修改redis数据
        try:
            CourseModel.objects.get(id=course_id, is_deleted=False, is_show=True)
        except CourseModel.DoesNotExist:
            # 课程不存在
            # 数据库中的数据删除
            redis.hdel(f"cart_{user_id}",course_id)
            return Response({"message":'当前商品不存在，货已经下架'})
        redis.hset(f"cart_{user_id}",course_id,selected)
        return Response({"message":'当前课程选中状态改变成功'})
    def put(self,request):
        user_id = request.user.id
        # 改成全选，取消全选
        selected = int(request.data.get('selected'))
        redis = get_redis_connection('cart')
        # 获取当前用户所有购物车数据
        cart_hash = redis.hgetall(f"cart_{user_id}")
        # 判断购物车是否存在数据
        if len(cart_hash) < 1:
            return Response({"message":'没有数据---'},status=status.HTTP_204_NO_CONTENT)
        # 获取当前购物车中所有课程id，循环的是key
        cart_list = [int(c.decode()) for c in cart_hash]

        # 开启管道，将多个命令，一起打包发送给redis数据库，减少频繁访问的网络通信的压力
        pipe = redis.pipeline()
        pipe.multi()
        for i in cart_list:
            pipe.hset(f"cart_{user_id}",i, selected)
        pipe.execute()
        return Response({"message":'修改成功'},status=status.HTTP_200_OK)
    def delete(self,request):
        # 从购物车中删除指定商品
        user_id = request.user.id
        course_id = int(request.query_params.get("course_id",0))
        redis = get_redis_connection("cart")
        redis.hdel(f"cart_{user_id}",course_id)
        return Response(status=status.HTTP_204_NO_CONTENT)


